/**
 * ---------------------------
 * Time: 2017/8/7 20:58.
 * Author: Cangshi
 * View: http://palerock.cn
 * ---------------------------
 */
define(['app', 'zepto'], function (app, $) {
    'use strict';
    app.service('ioService', function (accidentDao, deviceDao, configDao, templateDao, Device, ObjectUtils, ArrayUtils, INDEXED_DB, PromiseUtil, logger) {
        /**
         * [私有方法]
         * 因为json化后的Date数据会转化为字符串，在使用JSON.parse时不会自动转化为Date类型，在这里，手动将其转化为Date类型
         * @param data
         * @return {*}
         * @private
         */
        var _replaceDateProperty = function (data) {
            var replaceMap = {};
            // 将所有需要替换的属性找到，并转换为Date类型，存放在map中
            ObjectUtils.ergodicObject(this, data, function (value, key) {
                if (key.indexOf('.') != -1) {
                    // 获取属性名
                    var linkNames = key.split('.');
                    var propertyName = linkNames[linkNames.length - 1];
                    // 判断是否包含time字段
                    if (propertyName.indexOf('time') != -1 || propertyName.indexOf('Time') != -1) {
                        if (typeof value == 'string') {
                            replaceMap[key] = new Date(value);
                        }
                    }
                }
            }, true);
            // 遍历找到的属性映射，并替换对应属性
            ObjectUtils.ergodicObject(this, replaceMap, function (v, k) {
                data = ObjectUtils.createLinkProperty(data, k, v);
            });
            return data;
        };
        /**
         * 重新储存所有数据
         * @param data
         * @param cb
         * @private
         */
        var _restoreData = function (data, cb) {
            var dexieDB = INDEXED_DB.dexieDB;
            // 清除原来的数据
            dexieDB.delete();
            dexieDB.open();
            var args = [];
            ArrayUtils.ergodicArrayObject(this, data.devices, function (device) {
                args.push({
                    method: deviceDao.addDevice,
                    args: [Device.toDevice(device)]
                });
            });
            ArrayUtils.ergodicArrayObject(this, data.configs, function (config) {
                args.push({
                    method: configDao.addConfig,
                    args: [config.key, config.value]
                });
            });
            ArrayUtils.ergodicArrayObject(this, data.templates, function (template) {
                args.push({
                    method: templateDao.addTemplate,
                    args: [template]
                });
            });
            ArrayUtils.ergodicArrayObject(this, data.accidents, function (accident) {
                args.push({
                    method: accidentDao.insertAccident,
                    args: [accident]
                });
            });
            args.push(function (r) {
                var isSuccess = true;
                var error = [];
                ArrayUtils.getPropertyDo(this, r.e, 'code', function (code, ele) {
                    if (!code || code != 200) {
                        error.push(ele);
                        isSuccess = false;
                    }
                }, false);
                if (!isSuccess) {
                    $.alert('重新载入数据失败，请重启应用后再次导入数据');
                } else {
                    cb.call(window, r.e);
                }
            });
            var tasks = new PromiseUtil.ServiceTaskContainer();
            tasks.inService.apply(tasks, args);
        };
        this.saveAll = function () {
            if (!window.plus) {
                $.alert('请在手机使用该功能');
                return;
            }
            var data = {};
            data.time = new Date().getTime();
            data.sign = 'by-cangshi-obj';
            configDao.findAllConfig(function (r, e) {
                data.configs = r;
                deviceDao.findAllDevices(function (r, e) {
                    data.devices = r;
                    templateDao.findAllTemplates(function (r, e) {
                        data.templates = r;
                        accidentDao.findAllAccidents(function (r, e) {
                            data.accidents = r;
                            var dataString = JSON.stringify(data);
                            // logger.debug(dataString);
                            var base64 = new app.Base64();
                            app.createFile(app.basePath + '/device-store/data-' + data.time + '.json64', base64.encode(dataString));
                        })
                    })
                })
            })
        };
        this.loadData = function (file, cb) {
            app.readFile(file, function (data) {
                // 替换日期格式数据类型（以用于正确读取日期属性）
                data = _replaceDateProperty(data);
                // 重新储存已读取的数据到数据库
                _restoreData(data, cb);
            })
        }
    });
});